﻿#include <iostream>
//条款22：将成员变量声明为private

//将成员变量声明为private，可赋予客户访问数据的一致性（不用费劲记忆调用时，哪些需要小括号，哪些不需要）、可精确控制访问。

class AccessLevels
{
public:
    int GetReadOnly() const { return readOnly; } // 只读权限
    void setReadWrite(int value) { readWrite = value; } // 读写权限
    int getReadWrite() const { return readWrite; } // 读写权限
    void setWriteOnly(int value) { writeOnly = value; } // 只写权限
private:
    int noAccess; // 没有访问权限
    int readOnly; // 只读权限
    int writeOnly; // 只写权限
    int readWrite; // 读写权限
};
//更重要的是为了封装！！！如果你通过函数实现了对数据成员的访问，那么以后可以替换，使用者并不会察觉。将数据成员隐藏在函数接口之后可以提供各种实现灵活性。

class SpeedDataCollection
{
public:
    void AddValue(int speed){};
    double averageSpeed() const { return 0.0; };//返回平均速度
};
//重要的是，通过成员函数访问平均值（即通过封装它），可以交换这些不同的实现，而客户只需要重新编译。

//一旦将数据成员声明为public或protected,并且客户已经开始使用它，就很难更改有关该数据成员的任何内容。太多的代码需要重写、重新测试、重新编写文档或重新编译。
void item22()
{

}

//将数据成员声明为私有。它为客户提供了语法上一致的数据访问，提供了细粒度的访问控制，允许强制执行不变式，并为类作者提供了实现灵活性。
//protected并不比public更具有封装性。